Client VPN の証明書を Windows で作成してみた (EasyRSA 2 編)
みなさま Xin chao !
AWS Client VPN (以下 Client VPN) では、AWS Certificate Manager (以下 ACM) にインポートしたサーバー証明書が必要になります。
また、相互認証を使用する場合には、クライアント証明書も必要になります。
クライアント VPN エンドポイントを作成する - AWS VPN 管理者ガイド
Client VPN の導入を機に初めて証明書を作成する場合でも、AWS をはじめとする様々なドキュメントを見ながら比較的容易に自己証明書を作成することができます。
そのドキュメント ↑ ですが、いつの間にか Windows 環境での証明書作成手順が掲載されていました (私の記憶では以前は Linux 環境での作成手順しかなかったような気が...)。
そこで今回は Client VPN で使用するサーバー証明書とクライアント証明書を、実際に Windows 環境で (=WSL を使わずに) 作成してみたいと思います。
Windows なので、証明書の作成もできる限り GUI 操作で行いたい!という場合は、vpnux PKI Manager での方法もご覧ください。
やってみた
環境
今回は、以下の環境で試しています。
接続元 PC の OS | Windows Server 2019 (EC2) ※ Windows 10 Pro バージョン 1909 でも接続を確認済みです |
VPN クライアントアプリケーション | OpenVPN クライアント 2.4.9 |
認証方式 | 相互認証 (=クライアント証明書) |
証明書作成環境 | Windows Server 2019 (EC2) + OpenVPN クライアントと共にインストールした EasyRSA 2 |
クライアント証明書の保存先 | 接続元 PC のローカルフォルダ (C:\Certs) |
接続元 PC の利用者 | ローカル管理者権限あり (=ローカルの Administrators グループに所属) |
事前準備
証明書の作成には、OpenVPN クライアントアプリケーションと共にインストール可能な EasyRSA 2 を使用します。
OpenVPN クライアントアプリケーションは、以下のサイトよりダウンロード可能です。 事前に 「Windows インストーラ (Windows 10 用)」 をダウンロードしておきます。
OpenVPN クライアントアプリケーションのインストール
証明書作成環境となる Windows Server 2019 上で、OpenVPN クライアントアプリケーションのインストーラを実行します。
インストール時の注意点として、インストールするコンポーネントで、"EasyRSA 2 Certificate Management Scripts" を追加することを忘れないようにします。
証明書の作成
証明書作成環境となる Windows Server 2019 上で、証明書作成環境をセットアップしていきます。 コマンドプロンプトを [管理者として実行] します。
OpenVPN クライアントアプリケーションをインストールしたフォルダに移動します。
C:\Users\Administrator>cd "\Program Files\OpenVPN\easy-rsa"
init-config.bat を実行します。 実行すると vars.bat.sample ファイルが vars.bat ファイルとしてコピーされます。
C:\Program Files\OpenVPN\easy-rsa>init-config.bat C:\Program Files\OpenVPN\easy-rsa>copy vars.bat.sample vars.bat 1 個のファイルをコピーしました。
コピーされた vars.bat をメモ帳で開きます。
C:\Program Files\OpenVPN\easy-rsa>notepad.exe vars.bat
vars.bat の内容の KEY_COUNTRY, KEY_PROVINCE, KEY_CITY, KEY_ORG, KEY_EMAIL の値を以下のように変更し、保存します。
(変更前)
(変更後)
[管理者として実行] しているコマンドプロンプトで、変更後の vars.bat を実行します。
C:\Program Files\OpenVPN\easy-rsa>vars.bat
clean-all.bat を実行します (初回実行時には "指定されたファイルが見つかりません。" と表示されますが、無視して問題ありません)。
C:\Program Files\OpenVPN\easy-rsa>clean-all.bat 指定されたファイルが見つかりません。 1 個のファイルをコピーしました。 1 このファイルをコピーしました。
build-ca.bat を実行し、新しい認証機関 (CA) を構築します。 Country Name 等の入力を求められますが、そのまま [Enter] キーを押し、Common Name のみ入力します。 今回は自己証明書作成環境のため、実在しないドメイン名を入力しました。
C:\Program Files\OpenVPN\easy-rsa>build-ca.bat Can't load C:\Program Files\OpenVPN\easy-rsa/.rnd into RNG 4148:error:2406F079:random number generator:RAND_load_file:Cannot open file:crypto/rand/randfile.c:98:Filename=C:\Program Files\OpenVPN\easy-rsa/.rnd Generating a RSA private key ..........................................................+++++ .......................................................................+++++ writing new private key to 'keys\ca.key' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [JP]: State or Province Name (full name) [Tokyo]: Locality Name (eg, city) [Chiyoda-ku]: Organization Name (eg, company) [Classmethod, Inc.]: Organizational Unit Name (eg, section) [changeme]: Common Name (eg, your name or your server's hostname) [changeme]:masawo-cvpn.test Name [changeme]: Email Address [masawo@classmethod.jp]:
build-key-server.bat を実行し、サーバー証明書と秘密キーを作成します。 Country Name 等の入力を求められますが、そのまま [Enter] キーを押し、Common Name のみ入力します。 認証機関 (CA) 構築時に指定したのと同じドメイン名で指定しました。 最後に 2 回確認を求められますので、いずれも y を入力します (何も入力せずに Enter を押してしまうと n と同じ意味になります)。
C:\Program Files\OpenVPN\easy-rsa>build-key-server.bat server.masawo-cvpn.test Ignoring -days; not generating a certificate Generating a RSA private key ..................................................................................................+++++ ...................+++++ writing new private key to 'keys\server.key' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [JP]: State or Province Name (full name) [Tokyo]: Locality Name (eg, city) [Chiyoda-ku]: Organization Name (eg, company) [Classmethod, Inc.]: Organizational Unit Name (eg, section) [changeme]: Common Name (eg, your name or your server's hostname) [changeme]:server.masawo-cvpn.test Name [changeme]: Email Address [masawo@classmethod.jp]: Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []: Using configuration from openssl-1.0.0.cnf Check that the request matches the signature Signature ok The Subject's Distinguished Name is as follows countryName :PRINTABLE:'JP' stateOrProvinceName :PRINTABLE:'Tokyo' localityName :PRINTABLE:'Chiyoda-ku' organizationName :PRINTABLE:'Classmethod, Inc.' organizationalUnitName:PRINTABLE:'changeme' commonName :PRINTABLE:'server.masawo-cvpn.test' name :PRINTABLE:'changeme' emailAddress :IA5STRING:'masawo@classmethod.jp' Certificate is to be certified until Jun 28 09:38:39 2030 GMT (3650 days) Sign the certificate? [y/n]:y 1 out of 1 certificate requests certified, commit? [y/n]y Write out database with 1 new entries Data Base Updated
クライアント証明書と秘密キーを作成するため、build-key.bat を実行します。 Country Name 等の入力を求められますが、そのまま [Enter] キーを押し、Common Name のみ入力します。 認証機関 (CA) 構築時に指定したのと同じドメイン名で指定しました。 最後に 2 回確認を求められますので、いずれも y を入力します (何も入力せずに Enter を押してしまうと n と同じ意味になります)。
C:\Program Files\OpenVPN\easy-rsa>build-key.bat client01.masawo-cvpn.test Ignoring -days; not generating a certificate Generating a RSA private key ......................................................+++++ .............................................................................................................................................+++++ writing new private key to 'keys\client.key' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [JP]: State or Province Name (full name) [Tokyo]: Locality Name (eg, city) [Chiyoda-ku]: Organization Name (eg, company) [Classmethod, Inc.]: Organizational Unit Name (eg, section) [changeme]: Common Name (eg, your name or your server's hostname) [changeme]:client01.masawo-cvpn.test Name [changeme]: Email Address [masawo@classmethod.jp]: Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []: Using configuration from openssl-1.0.0.cnf Check that the request matches the signature Signature ok The Subject's Distinguished Name is as follows countryName :PRINTABLE:'JP' stateOrProvinceName :PRINTABLE:'Tokyo' localityName :PRINTABLE:'Chiyoda-ku' organizationName :PRINTABLE:'Classmethod, Inc.' organizationalUnitName:PRINTABLE:'changeme' commonName :PRINTABLE:'client01.masawo-cvpn.test' name :PRINTABLE:'changeme' emailAddress :IA5STRING:'masawo@classmethod.jp' Certificate is to be certified until Jun 28 09:45:35 2030 GMT (3650 days) Sign the certificate? [y/n]:y 1 out of 1 certificate requests certified, commit? [y/n]y Write out database with 1 new entries Data Base Updated
C:\Program Files\OpenVPN\easy-rsa\keys フォルダを確認すると、Client VPN に必要な認証機関 (CA) 証明書, サーバー証明書と秘密キー, クライアント証明書と秘密キーが作成されています。
ACM への証明書のインポート
今回は、AWS マネジメントコンソールを使って、ACM にサーバー証明書をインポートしてみます。 ACM のコンソールを開き [証明書のインポート] をクリックします。
それぞれの入力欄には、以下のファイルの内容をコピーします (ファイルの内容はメモ帳等で確認できます)。
- 証明書本文 ・・・ サーバー証明書 (eg. server.masawo-cvpn.test.crt)
- 証明書のプライベートキー ・・・ サーバー証明書秘密キー (eg. server.masawo-cvpn.test.key)
- 証明書チェーン ・・・ CA 証明書 (eg. ca.crt)
インポートが完了しました。
今回のように、サーバー証明書とクライアント証明書が同一の認証機関 (CA) から発行されている場合、クライアント証明書については ACM にインポートする必要はありません。
クライアント証明書を ACM にアップロードする必要があるのは、クライアント証明書の CA がサーバー証明書の CA と異なる場合だけです。
Client VPN エンドポイントの作成
Client VPN エンドポイントは、AWS のドキュメントをもとに、相互認証を使用するように作成します。
クライアント VPN エンドポイント - AWS VPN 管理者ガイド
作成後、Client VPN クライアント設定ファイル (.ovpn) を、ダウンロードしておきます。
Client VPN クライアントの設定
今回は、Client VPN クライアントの C:\Certs フォルダにクライアント証明書 (client01.masawo-cvpn.test.crt と client01.masawo-cvpn.test.key) を保存しましたので、Client VPN クライアント設定ファイルに以下を追記します (フォルダの区切りである \ は 2 つ続けて \ と記載することを忘れずに)。
cert C:\\Certs\\client01.masawo-cvpn.test.crt key C:\\Certs\\client01.masawo-cvpn.test.key
また、AWS のドキュメントをもとに、Client VPN エンドポイントの DNS 名を変更することも忘れないようにします。
ステップ 6: クライアント VPN エンドポイントの設定ファイルをダウンロードする - クライアント VPN の開始方法
(変更前の例)
remote cvpn-endpoint-0123456789ABCDEF0.prod.clientvpn.us-east-1.amazonaws.com 443
(変更後の例)
remote asdfa.cvpn-endpoint-0123456789ABCDEF0.prod.clientvpn.us-east-1.amazonaws.com 443
編集後の Client VPN クライアント設定ファイルを、以下のフォルダに保存します。
C:\Program Files\OpenVPN\config
Client VPN エンドポイントに接続
ここまでで準備が整いましたので、VPN 接続してみたいと思います。
証明書を作成した環境にはすでに OpenVPN クライアントアプリケーションがインストールされていますので、それを使って接続テストしてみます。
タスクトレイの OpenVPN GUI アイコンを右クリック → [接続] をクリックして、VPN 接続します。
無事に接続できました。
さいごに
WSL も使わずに、Windows だけで Client VPN で使用するサーバー証明書とクライアント証明書を作成してみました。
AWS のドキュメントをはじめとする各種ドキュメントに証明書作成手順は紹介されており、Linux に詳しくなくても、WSL 環境さえセットアップできれば Windows PC で証明書を作成することは可能ですが、様々な事情により WSL を使うことができない場合もあると思い、また、Windows だけで証明書を作成している情報も少なかったので、今回実際に試してみました。
このブログを書いている本日は 7 月 7 日です。
世間的には「七夕」の日として知られている日かと思いますが、弊社社内では「クラスメソッド創立記念日」一色となる日です!